#define _CRT_SECURE_NO_WARNINGS

//#include <iostream>
//using namespace std;
//
//#define MAXSIZE 4
//
//typedef char ElemType;
//
//typedef struct {
//    ElemType data[MAXSIZE];
//    int front;
//    int rear;
//} SqQueue;
//
//void InitQueue(SqQueue& q) {
//    q.front = q.rear = 0;
//}
//
//bool QueueNotEmpty(SqQueue q) {
//    return q.front != q.rear;
//}
//
//bool EnQueue(SqQueue& q, ElemType x) {
//    if ((q.rear + 1) % MAXSIZE == q.front) {
//        return false; // Queue is full
//    }
//    q.data[q.rear] = x;
//    q.rear = (q.rear + 1) % MAXSIZE;
//    return true;
//}
//
//bool DeQueue(SqQueue& q, ElemType& x) {
//    if (q.front == q.rear) {
//        return false; // Queue is empty
//    }
//    x = q.data[q.front];
//    q.front = (q.front + 1) % MAXSIZE;
//    return true;
//}
//
//void DestroyQueue(SqQueue& q) {
//    q.front = q.rear = 0;
//}
//
//int main() {
//    SqQueue q;
//    InitQueue(q);
//
//    cout << "Queue is not empty: " << QueueNotEmpty(q) << endl;
//
//    EnQueue(q, 'a');
//    EnQueue(q, 'b');
//    EnQueue(q, 'c');
//
//    ElemType x;
//    DeQueue(q, x);
//    cout << "Dequeued element: " << x << endl;
//
//    EnQueue(q, 'd');
//    EnQueue(q, 'e');
//    EnQueue(q, 'f');
//
//    cout << "Dequeued sequence: ";
//    while (DeQueue(q, x)) {
//        cout << x << " ";
//    }
//    cout << endl;
//
//    DestroyQueue(q);
//
//    return 0;
//}



#include <iostream>
#include <string>
#include <cmath>
//using namespace std;
//
//#define MAXSIZE 40
//
//typedef char ElemType;
//
//typedef struct {
//    ElemType data[MAXSIZE];
//    int front;
//    int rear;
//} SqQueue;
//
//void InitQueue(SqQueue& q) {
//    q.front = q.rear = 0;
//}
//
//bool QueueNotEmpty(SqQueue q) {
//    return q.front != q.rear;
//}
//
//bool EnQueue(SqQueue& q, ElemType x) {
//    if ((q.rear + 1) % MAXSIZE == q.front) {
//        return false; // Queue is full
//    }
//    q.data[q.rear] = x;
//    q.rear = (q.rear + 1) % MAXSIZE;
//    return true;
//}
//
//bool DeQueue(SqQueue& q, ElemType& x) {
//    if (q.front == q.rear) {
//        return false; // Queue is empty
//    }
//    x = q.data[q.front];
//    q.front = (q.front + 1) % MAXSIZE;
//    return true;
//}
//
//void DestroyQueue(SqQueue& q) {
//    q.front = q.rear = 0;
//}
//
//void DecimalToBinary(double num) {
//    SqQueue q;
//    InitQueue(q);
//
//    int intPart = static_cast<int>(num);
//    double decimalPart = num - intPart;
//
//    while (intPart > 0) {
//        EnQueue(q, intPart % 2 + '0');
//        intPart /= 2;
//    }
//
//    string result = "0.";
//    while (decimalPart > 0 && result.size() <= 9) {
//        decimalPart *= 2;
//        int bit = static_cast<int>(decimalPart);
//        result += to_string(bit);
//        decimalPart -= bit;
//    }
//
//    cout << "Binary representation of " << num << ": ";
//    while (QueueNotEmpty(q)) {
//        ElemType x;
//        DeQueue(q, x);
//        cout << x;
//    }
//    cout << result << endl;
//
//    DestroyQueue(q);
//}
//
//int main() {
//    DecimalToBinary(0.635);
//
//    return 0;
//}



using namespace std;

#define MAXSIZE 40

typedef char ElemType;

typedef struct {
    ElemType data[MAXSIZE];
    int front;
    int rear;
} SqQueue;

void InitQueue(SqQueue& q) {
    q.front = q.rear = 0;
}

bool QueueNotEmpty(SqQueue q) {
    return q.front != q.rear;
}

bool EnQueue(SqQueue& q, ElemType x) {
    if ((q.rear + 1) % MAXSIZE == q.front) {
        return false; // Queue is full
    }
    q.data[q.rear] = x;
    q.rear = (q.rear + 1) % MAXSIZE;
    return true;
}

bool DeQueue(SqQueue& q, ElemType& x) {
    if (q.front == q.rear) {
        return false; // Queue is empty
    }
    x = q.data[q.front];
    q.front = (q.front + 1) % MAXSIZE;
    return true;
}

void DestroyQueue(SqQueue& q) {
    q.front = q.rear = 0;
}

void DecimalToBinary(double num) {
    SqQueue q;
    InitQueue(q);

    int intPart = static_cast<int>(num);
    double decimalPart = num - intPart;

    while (intPart > 0) {
        EnQueue(q, intPart % 2 + '0');
        intPart /= 2;
    }

    string result = "0.";
    while (decimalPart > 0 && result.size() <= 9) {
        decimalPart *= 2;
        int bit = static_cast<int>(decimalPart);
        result += to_string(bit);
        decimalPart -= bit;
    }

    cout << "Binary representation of " << num << ": ";
    while (QueueNotEmpty(q)) {
        ElemType x;
        DeQueue(q, x);
        cout << x;
    }
    cout << result << endl;

    DestroyQueue(q);
}

void DecimalToArbitraryBase(double num, int base) {
    SqQueue q;
    InitQueue(q);

    int intPart = static_cast<int>(num);
    double decimalPart = num - intPart;

    string baseDigits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    while (intPart > 0) {
        EnQueue(q, baseDigits[intPart % base]);
        intPart /= base;
    }

    string result = ".";
    while (decimalPart > 0 && result.size() <= 9) {
        decimalPart *= base;
        int digit = static_cast<int>(decimalPart);
        result += baseDigits[digit];
        decimalPart -= digit;
    }

    cout << "Base-" << base << " representation of " << num << ": ";
    while (QueueNotEmpty(q)) {
        ElemType x;
        DeQueue(q, x);
        cout << x;
    }
    cout << result << endl;

    DestroyQueue(q);
}

int main() {
    DecimalToBinary(0.635);
    DecimalToArbitraryBase(0.1234567, 29);

    return 0;
}